public class Code1 {
   //  删除并获得点数
   public int deleteAndEarn(int[] nums) {
       // 针对这道题目，我们先对数据要进行一个简单的预处理
       // 我们需要先创建出一个数组，数组下标所对应的数字就是在 nums 中出现过的数字。并且将 nums 中出现的数字求和存储到该数组中
       int n = 10001;

       int[] arr = new int[n];
       for(int x : nums) arr[x] += x;

       // 动态规划解决问题
       // 创建 dp 表 （这个问题在预处理后就和打家劫舍问题几乎一样了）
       // f[i] 表示的是偷到 i 位置时，取 nums[i]，此时的最大值
       // g[i] 表示的是偷到 i 位置时，不取 nums[i]，此时的最大值
       int[] f = new int[n];
       int[] g = new int[n];

       // 初始化
       f[0] = arr[0];
       // 填表
       for(int i = 1; i < n; i++){
           f[i] = g[i - 1] + arr[i];
           g[i] = Math.max(f[i - 1], g[i - 1]);
       }
       // 此时返回的是两个表中的最后位置最大值
       return Math.max(f[n - 1],g[n - 1]);
   }
}
